<?php
namespace app\command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Illuminate\Support\Str;
use think\facade\Db;

class UpdatePicCommand extends Command
{
    protected static $defaultName = 'update:pic';
    protected static $defaultDescription = '更新图片路径';

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('更新数据库图片路径工具');

        // 创建交互式IO
        $io = new SymfonyStyle($input, $output);

        // 获取老网址和新网址
        $oldUrl = $io->ask('请输入老网址（例如: http://example1.com）', '');
        $newUrl = $io->ask('请输入新网址（例如: https://example2.com）');

        if (empty($newUrl)) {
            $output->writeln("<error>新网址不能为空！</error>");
            return Command::FAILURE;
        }

        // 确认替换
        $confirm = $io->confirm("确认将数据库中所有 \"{$oldUrl}\" 替换为 \"{$newUrl}\"？", false);
        if (!$confirm) {
            $output->writeln("<error>操作已取消</error>");
            return Command::FAILURE;
        }


        // 更新各个表中的图片路径
        $output->writeln("开始更新数据库图片路径...");

        // 1. 更新goods表的slider_image字段（特殊处理JSON格式）
        $output->writeln("1. 更新goods表...");
        $this->updateGoodsSliderImage('goods', 'slider_image', $oldUrl, $newUrl);
        $output->writeln("   - goods表更新完成");

        // 2. 更新goods_category表的pic字段
        $output->writeln("2. 更新goods_category表...");
        $this->updateField('goods_category', 'pic', $oldUrl, $newUrl);
        $output->writeln("   - goods_category表更新完成");

        // 3. 更新goods_comment表的content字段
        $output->writeln("3. 更新goods_comment表...");
        $this->updateField('goods_comment', 'content', $oldUrl, $newUrl);
        $output->writeln("   - goods_comment表更新完成");

        // 4. 更新goods_content_file表的file_url字段
        $output->writeln("4. 更新goods_content_file表...");
        $this->updateField('goods_content_file', 'file_url', $oldUrl, $newUrl);
        $output->writeln("   - goods_content_file表更新完成");

        // 5. 更新system_config表的value字段
        $output->writeln("5. 更新system_config表...");
        $this->updateField('system_config', 'value', $oldUrl, $newUrl);
        $output->writeln("   - system_config表更新完成");

        // 6. 更新system_uploads表的url字段
        $output->writeln("6. 更新system_uploads表...");
        $this->updateField('system_uploads', 'url', $oldUrl, $newUrl);
        $output->writeln("   - system_uploads表更新完成");

        // 7. 更新user表的avatar字段
        $output->writeln("7. 更新user表...");
        $this->updateField('user', 'avatar', $oldUrl, $newUrl);
        $output->writeln("   - user表更新完成");

        // 提交事务
        Db::commit();

        $output->writeln('更新完成');

        return Command::SUCCESS;

    }

    /**
     * 更新普通字段中的URL
     * 
     * @param string $table 表名
     * @param string $field 字段名
     * @param string $oldUrl 旧URL
     * @param string $newUrl 新URL
     */
    protected function updateField(string $table, string $field, string $oldUrl, string $newUrl): void
    {
        Db::table($table)
            ->where($field, 'like', "%{$oldUrl}%")
            ->update([
                $field => Db::raw("REPLACE({$field}, '{$oldUrl}', '{$newUrl}')")
            ]);
    }

    /**
     * 特殊处理goods表的slider_image字段
     * goods表中的slider_image字段存储的是JSON序列化后的字符串，需要特殊处理
     * 
     * @param string $table 表名
     * @param string $field 字段名
     * @param string $oldUrl 旧URL
     * @param string $newUrl 新URL
     */
    protected function updateGoodsSliderImage(string $table, string $field, string $oldUrl, string $newUrl): void
    {
        // 需要找出所有可能的URL表示形式并替换

        // 1. 处理双引号内完全转义的URL (如JSON.stringify后的格式)
        $escapedOld = str_replace(['/', ':'], ['\/', '\:'], $oldUrl);
        $escapedNew = str_replace(['/', ':'], ['\/', '\:'], $newUrl);

        // 直接使用SQL执行更新
        Db::query("UPDATE {$table} SET {$field} = REPLACE({$field}, ?, ?)", [$escapedOld, $escapedNew]);

        // 2. 处理只转义了斜杠的URL (常见于JSON.stringify)
        $slashEscapedOld = str_replace('/', '\\/', $oldUrl);
        $slashEscapedNew = str_replace('/', '\\/', $newUrl);

        Db::query("UPDATE {$table} SET {$field} = REPLACE({$field}, ?, ?)", [$slashEscapedOld, $slashEscapedNew]);

        // 3. 处理未转义的URL (以防万一)
        Db::query("UPDATE {$table} SET {$field} = REPLACE({$field}, ?, ?)", [$oldUrl, $newUrl]);
    }
}